home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / RCS / ecvt.c,v < prev    next >
Text File  |  1989-05-18  |  2KB  |  149 lines

  1. head     1.2;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.2
  10. date     89.05.18.17.12.06;  author rab;  state Exp;
  11. branches ;
  12. next     1.1;
  13.  
  14. 1.1
  15. date     89.05.18.16.04.10;  author rab;  state Exp;
  16. branches ;
  17. next     ;
  18.  
  19.  
  20. desc
  21. @@
  22.  
  23.  
  24. 1.2
  25. log
  26. @Added forward declarations for static functions.
  27. @
  28. text
  29. @#if defined(LIBC_SCCS) && !defined(lint)
  30. static char sccsid[] = "@@(#)ecvt.c    5.1 (Berkeley) 3/15/86";
  31. #endif LIBC_SCCS and not lint
  32.  
  33. /*
  34.  *    ecvt converts to decimal
  35.  *    the number of digits is specified by ndigit
  36.  *    decpt is set to the position of the decimal point
  37.  *    sign is set to 0 for positive, 1 for negative
  38.  */
  39.  
  40. static char *cvt();
  41.  
  42. #define    NDIG    80
  43. char*
  44. ecvt(arg, ndigits, decpt, sign)
  45. double arg;
  46. int ndigits, *decpt, *sign;
  47. {
  48.     return(cvt(arg, ndigits, decpt, sign, 1));
  49. }
  50.  
  51. char*
  52. fcvt(arg, ndigits, decpt, sign)
  53. double arg;
  54. int ndigits, *decpt, *sign;
  55. {
  56.     return(cvt(arg, ndigits, decpt, sign, 0));
  57. }
  58.  
  59. static char*
  60. cvt(arg, ndigits, decpt, sign, eflag)
  61. double arg;
  62. int ndigits, *decpt, *sign;
  63. {
  64.     register int r2;
  65.     double fi, fj;
  66.     register char *p, *p1;
  67.     static char buf[NDIG];
  68.     double modf();
  69.  
  70.     if (ndigits<0)
  71.         ndigits = 0;
  72.     if (ndigits>=NDIG-1)
  73.         ndigits = NDIG-2;
  74.     r2 = 0;
  75.     *sign = 0;
  76.     p = &buf[0];
  77.     if (arg<0) {
  78.         *sign = 1;
  79.         arg = -arg;
  80.     }
  81.     arg = modf(arg, &fi);
  82.     p1 = &buf[NDIG];
  83.     /*
  84.      * Do integer part
  85.      */
  86.     if (fi != 0) {
  87.         p1 = &buf[NDIG];
  88.         while (fi != 0) {
  89.             fj = modf(fi/10, &fi);
  90.             *--p1 = (int)((fj+.03)*10) + '0';
  91.             r2++;
  92.         }
  93.         while (p1 < &buf[NDIG])
  94.             *p++ = *p1++;
  95.     } else if (arg > 0) {
  96.         while ((fj = arg*10) < 1) {
  97.             arg = fj;
  98.             r2--;
  99.         }
  100.     }
  101.     p1 = &buf[ndigits];
  102.     if (eflag==0)
  103.         p1 += r2;
  104.     *decpt = r2;
  105.     if (p1 < &buf[0]) {
  106.         buf[0] = '\0';
  107.         return(buf);
  108.     }
  109.     while (p<=p1 && p<&buf[NDIG]) {
  110.         arg *= 10;
  111.         arg = modf(arg, &fj);
  112.         *p++ = (int)fj + '0';
  113.     }
  114.     if (p1 >= &buf[NDIG]) {
  115.         buf[NDIG-1] = '\0';
  116.         return(buf);
  117.     }
  118.     p = p1;
  119.     *p1 += 5;
  120.     while (*p1 > '9') {
  121.         *p1 = '0';
  122.         if (p1>buf)
  123.             ++*--p1;
  124.         else {
  125.             *p1 = '1';
  126.             (*decpt)++;
  127.             if (eflag==0) {
  128.                 if (p>buf)
  129.                     *p = '0';
  130.                 p++;
  131.             }
  132.         }
  133.     }
  134.     *p = '\0';
  135.     return(buf);
  136. }
  137. @
  138.  
  139.  
  140. 1.1
  141. log
  142. @Initial revision
  143. @
  144. text
  145. @d12 1
  146. a12 1
  147. char    *cvt();
  148. @
  149.